package com.ruoyi.vote.common.utils;

import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.redis.RedisUtils;

import java.time.Duration;
import java.time.Instant;
import java.util.Date;

/**
 * 选手编号生成
 * @author 立勤
 * @date 2023/07/20 10:09:12
 */
public class CreateNumberUtil {

    public static Long generateContestantNumber(String eventId, Date voteStopTime) {
        String contestantNumberKey = KeyUtils.formatNumberPool(eventId);

        long nextNumber;

        if (RedisUtils.isExistsObject(contestantNumberKey)) {
            // 使用Redis原子自增操作获取下一个唯一的编号
            nextNumber = RedisUtils.incrAtomicValue(contestantNumberKey);
        } else {
            // 生成策略: 当前年月日+01
            nextNumber = Long.parseLong(DateUtils.dateTimeNow(DateUtils.YYMMDD) + "001");
            // 计算过期时间
            Instant instantEndTime = voteStopTime.toInstant();
            long expirationSeconds = instantEndTime.getEpochSecond() - Instant.now().getEpochSecond();
            RedisUtils.expire(contestantNumberKey, Duration.ofSeconds(expirationSeconds));
            // 存储在缓存中，并设置过期时间为活动结束时间
            RedisUtils.setAtomicValue(contestantNumberKey, nextNumber);
        }

        // 号码去重机制
        String acsKey = KeyUtils.formatAcsKey(eventId, String.valueOf(nextNumber));
        while (RedisUtils.isExistsObject(acsKey)) {
            // 如果当前号码已存在，则继续生成新的号码直到唯一为止
            nextNumber++;
            acsKey = KeyUtils.formatAcsKey(eventId, String.valueOf(nextNumber));
        }
        return nextNumber;
    }

}
